package ar.uba.fi.algo3.tp1.vista;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import ar.uba.fi.algo3.tp1.controlador.ObservadorVista;

public class VentanaDerivar implements MouseListener, ActionListener{

	private static final long serialVersionUID = -4331528814592291212L;
	
	//Atributos
	private JFrame frame;
	
	private JPanel panelContenido;
	private JPanel panelInferior;
	
	private String punto;
	private JTextField campo;
	
	private JButton botonAceptar;  //
	private JButton botonCancelar; // Botones de la ventana
	
	private String funcionActiva;
	
	private ArrayList<ObservadorMensajes> observadoresMensaje;
	private ArrayList<ObservadorVista> observadoresVista;
	
	public VentanaDerivar(String funcion){
		JFrame frame = this.getFrame();
		this.observadoresMensaje = new ArrayList<ObservadorMensajes>();
		this.observadoresVista = new ArrayList<ObservadorVista>();
		this.setFuncionActiva(funcion);
		frame.setContentPane(this.getContentPane());
		JPanel panel = (JPanel)frame.getContentPane();
		panel.add(new JLabel("Punto:"));
		panel.add(this.getCampo());
		panel.add(this.getPanelInferior());
		frame.pack();
		this.setVisible(true);
	}
	
	private JFrame getFrame() {
		if (this.frame == null){
			this.frame = new JFrame("Derivar");
		}
		return this.frame;
	}
	
	public void setVisible(boolean bool){
		this.getFrame().setVisible(bool);
	}
	
	public JPanel getContentPane(){
		if (this.panelContenido == null){
			this.panelContenido = new JPanel(new GridLayout(3,1));
		}
		return this.panelContenido;
	}
	
	private JPanel getPanelInferior() {
		if (this.panelInferior == null ) {
			this.panelInferior = new JPanel(new FlowLayout());
			this.panelInferior.add(this.getBotonAceptar());
			this.panelInferior.add(this.getBotonCancelar());
		}
		return this.panelInferior;
	}
	
	public JButton getBotonAceptar() {
		if (this.botonAceptar==null) {
			this.botonAceptar=new JButton("Aceptar");
			this.botonAceptar.addMouseListener(this);
		}
		return this.botonAceptar;
	}

	public JButton getBotonCancelar() {
		if (this.botonCancelar==null) {
			this.botonCancelar=new JButton("Cancelar");
			this.botonCancelar.addMouseListener(this);
		}
		return this.botonCancelar;
	}

	private JTextField getCampo() {
		if (this.campo == null ) {
			this.campo = new JTextField();
			this.campo.setActionCommand(this.punto);
			this.campo.addActionListener(this);
		}
		return this.campo;
	}

	public void mouseClicked(MouseEvent e) {
		JButton boton = (JButton)e.getComponent();
		if ( boton.getText() == "Aceptar" ) {
			try {
				Double punto = new Double(this.getCampo().getText());
				this.notificarDerivar(this.getFuncionActiva(),punto);
			} catch (NumberFormatException exepcion){
				this.notificarObservadoresMensajes("Error: Ingresar nuevo punto");
			}
		} else if ( boton.getText() == "Cancelar" ) {}
		this.getFrame().setVisible(false);
	}

	public void actionPerformed(ActionEvent e) {
		try {
			Double punto = new Double(this.getCampo().getText());
			this.notificarDerivar(this.getFuncionActiva(),punto);
		} catch (NumberFormatException exepcion){
			this.notificarObservadoresMensajes("Error: Ingresar nuevo punto");
		}
		this.getFrame().setVisible(false);
	}
	
	public void agregarObservadorMensajes(ObservadorMensajes observador){
		this.observadoresMensaje.add(observador);
	}
	
	public void notificarObservadoresMensajes(String ... mensajes){
		for(ObservadorMensajes observador : this.observadoresMensaje){
			observador.actualizar(mensajes);
		}
	}
	
	public void agregarObservadorVista(ObservadorVista observador){
		this.observadoresVista.add(observador);
	}
	
	public void notificarDerivar(String funcion, double punto){
		for (ObservadorVista observador : this.observadoresVista){
			observador.seDerivo(funcion,punto);
		}
	}
	
	public void mouseEntered(MouseEvent e) {}

	public void mouseExited(MouseEvent e) {}

	public void mousePressed(MouseEvent e) {}

	public void mouseReleased(MouseEvent e) {}

	public String getFuncionActiva() {
		return funcionActiva;
	}

	public void setFuncionActiva(String funcionActiva) {
		this.funcionActiva = funcionActiva;
	}
}
